#include <iostream>
#include <unistd.h>
#include <functional>
#include <pthread.h>
#include <vector>
#include <string>
using namespace std;

pthread_t id;
class thread_ret
{
    friend int main();

public:
    thread_ret(pthread_t tid, string info)
        : _tid(tid), _info(info)
    {
    }

private:
    pthread_t _tid;
    string _info;
};
void *mythod(void *func) // 线程所执行的方法
{
    pthread_cancel(id);//主线程终止后，但是新线程还可以运行
    
    int cnt = 5;
    while (cnt--)
    {
        cout << "I am a new thread,mytid = " << pthread_self() << endl;
        sleep(1);
    }
    // exit(123);             // 终止进程，并不是单单终止线程

    // 线程终止
    // pthread_exit((void*)"123456"); // 终止线程
    // return (void*)"123456";//字符常量区数据的起始地址

    thread_ret *r = new thread_ret(pthread_self(), "thread quit");
    return (void *)r;
    
    // 未执行return，线程取消导致返回值为(void*)-1（PTHREAD_CANCELED）
}
int main()
{
    sleep(3);
    id=pthread_self();
    // 创建线程
    pthread_t tid;
    pthread_create(&tid, nullptr, mythod, nullptr); // 传过去的tid就是新建线程的id

    // main
    cout << "I am a init thread,creat tid = " << tid << endl;

    // 线程等待
    //  void* r=nullptr;//作为输出型参数，接收mythod(线程所执行方法的返回值)返回值
    //  int ret = pthread_join(tid,&r);//阻塞式一直等待，线程返回值存在第二个参数中
    //  thread_ret* obj = (thread_ret*)r;
    //  cout<<"线程返回值内容为:"<<obj->_info<<" "<<obj->_tid<<endl;
    //  if(!ret)cout<<"等待成功"<<endl;

    // 线程设置成分离状态(可以在线程函数也可以在主函数)
    // 分离以后就不需要等待了
    //pthread_detach(tid);

    // 直接取消一个线程(尽管分离)
    sleep(3);
    int n = pthread_cancel(tid);
    cout << "pthread_cancel return : " << n << endl;

    int ret = pthread_join(tid, nullptr);
    cout << "pthread_join return : " << ret << endl;

    return 0;
}